package com.itheima.exceptiondemo;

import java.util.Scanner;

public class Demo {
    public static void main(String[] args) {
        //2、异常
        //编译时异常和运行时异常的区别（记忆）
        /*编译时异常
                - 都是Exception类及其子类
                - 必须显示处理，否则程序就会发生错误，无法通过编译
                - 运行时异常
                - 都是RuntimeException类及其子类
                - 无需显示处理，也可以和编译时异常一样处理*/
        //JVM默认处理异常的方式（理解）
        /*如果程序出现了问题，我们没有做任何处理，
          最终JVM 会做默认的处理，处理方式有如下两个步骤：
          把异常的名称，错误原因及异常出现的位置等信息输出在了控制台
          程序停止执行*/
        //查看异常信息 (理解)
        /*控制台在打印异常信息时,会打印异常类名,异常出现的原因,异常出现的位置
        我们调bug时,可以根据提示,找到异常出现的位置,分析原因,修改异常代码*/
        //throws方式处理异常（应用）
        //定义格式：
        /*public void 方法() throws 异常类名 {
        }*/
        //示例
        /*public class ExceptionDemo {
            public static void main(String[] args) throws ParseException{
                System.out.println("开始");
                //method();
                method2();

                System.out.println("结束");
            }

            //编译时异常
            public static void method2() throws ParseException {
                String s = "2048-08-09";
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                Date d = sdf.parse(s);
                System.out.println(d);
            }

            //运行时异常
            public static void method() throws ArrayIndexOutOfBoundsException {
                int[] arr = {1, 2, 3};
                System.out.println(arr[3]);
            }
        }*/
        //注意事项
        /*这个throws格式是跟在方法的括号后面的
        编译时异常必须要进行处理，两种处理方案：try...catch …或者 throws，如果采用 throws 这种方案，在方法上进行显示声明,将来谁调用这个方法谁处理
        运行时异常因为在运行时才会发生,所以在方法后面可以不写,运行时出现异常默认交给jvm处理*/
        Student stu = new Student();
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入姓名");
        String name = sc.nextLine();
        stu.setName(name);
        while (true) {
            try {
                System.out.println("请输入年龄");
                String ageStr = sc.nextLine();
                int age = Integer.parseInt(ageStr);
                stu.setAge(age);
                break;
            } catch (NumberFormatException e) {
                System.out.println("输入的年龄必须是整数");
            } catch (AgeOutOfBoundsException e) {
                System.out.println("输入的年龄必须是在18到25岁之间");
            }
        }
        System.out.println(stu);
    }
}
